package com.huashi.dealer.core.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * API HTTP客户端工具类
 * 用于其他项目调用本项目的API接口
 * <p>
 * 使用示例：
 * // 初始化配置
 * ApiHttpClient.init("http://localhost:8080", "/v1/api");
 * <p>
 * // 调用API - 基础用法
 * CommonResult result = ApiHttpClient.get("/mes/getTotalNum", "system1", "api_key_123");
 * <p>
 * // 调用API - 带查询参数
 * Map<String, Object> params = new HashMap<>();
 * params.put("barCode", "6923651604349");
 * params.put("goodsNo", "HC0013044");
 * String response = ApiHttpClient.get("/v1/api/mes/getTotalNum", "crm_system", "CRM2024002B3C4D5E6F7G8H9I0J1K", params);
 * System.out.println(response);
 * <p>
 * // 调用API - POST请求
 * String postResponse = ApiHttpClient.post("/v1/api/some/endpoint", "crm_system", "CRM2024002B3C4D5E6F7G8H9I0J1K", requestBody);
 */
@Slf4j
public class ApiHttpClient {

    // 配置信息
    private static String baseUrl = "http://192.168.1.110:8103";
    private static String contextPath = "/";
    private static int timeout = 30000; // 30秒超时

    /**
     * 初始化配置
     *
     * @param baseUrl     基础URL，如：http://localhost:8080
     * @param contextPath 上下文路径，如：/v1/api 或 /
     */
    public static void init(String baseUrl, String contextPath) {
        ApiHttpClient.baseUrl = baseUrl;
        ApiHttpClient.contextPath = contextPath;
    }

    /**
     * 初始化配置（简单版本）
     *
     * @param baseUrl 基础URL，如：http://localhost:8080
     */
    public static void init(String baseUrl) {
        init(baseUrl, "/");
    }

    /**
     * 设置超时时间
     *
     * @param timeout 超时时间（毫秒）
     */
    public static void setTimeout(int timeout) {
        ApiHttpClient.timeout = timeout;
    }

    /**
     * 发起GET请求
     *
     * @param path       API路径，如：/mes/getTotalNum
     * @param systemName 系统名称
     * @param apiKey     API密钥
     * @return 响应字符串
     */
    public static String get(String path, String systemName, String apiKey) {
        return get(path, systemName, apiKey, null);
    }

    /**
     * 发起GET请求（带查询参数）
     *
     * @param path       API路径，如：/mes/getTotalNum
     * @param systemName 系统名称
     * @param apiKey     API密钥
     * @param params     查询参数
     * @return 响应字符串
     */
    public static String get(String path, String systemName, String apiKey, Map<String, Object> params) {
        return executeRequest(Method.GET, path, systemName, apiKey, params, null);
    }

    /**
     * 发起POST请求
     *
     * @param path       API路径，如：/mes/getTotalNum
     * @param systemName 系统名称
     * @param apiKey     API密钥
     * @param body       请求体（对象或JSON字符串）
     * @return 响应字符串
     */
    public static String post(String path, String systemName, String apiKey, Object body) {
        return executeRequest(Method.POST, path, systemName, apiKey, null, body);
    }

    /**
     * 发起PUT请求
     *
     * @param path       API路径
     * @param systemName 系统名称
     * @param apiKey     API密钥
     * @param body       请求体
     * @return 响应字符串
     */
    public static String put(String path, String systemName, String apiKey, Object body) {
        return executeRequest(Method.PUT, path, systemName, apiKey, null, body);
    }

    /**
     * 发起DELETE请求
     *
     * @param path       API路径
     * @param systemName 系统名称
     * @param apiKey     API密钥
     * @param params     查询参数
     * @return 响应字符串
     */
    public static String delete(String path, String systemName, String apiKey, Map<String, Object> params) {
        return executeRequest(Method.DELETE, path, systemName, apiKey, params, null);
    }

    /**
     * 执行HTTP请求的核心方法
     */
    private static String executeRequest(Method method, String path, String systemName, String apiKey,
                                         Map<String, Object> params, Object body) {
        try {
            // 构建完整URL
            String fullUrl = buildUrl(path);

            // 创建HTTP请求
            HttpRequest request = HttpUtil.createRequest(method, fullUrl);

            // 设置认证参数
            if (StrUtil.isNotBlank(systemName)) {
                // 同时设置请求头和URL参数，以兼容不同的认证方式
                request.header("system_name", systemName);
                request.form("system_name", systemName);
            }

            if (StrUtil.isNotBlank(apiKey)) {
                request.header("X-API-Key", apiKey);
            }

            // 设置查询参数
            if (params != null && !params.isEmpty()) {
                params.forEach((key, value) -> {
                    if (value != null) {
                        request.form(key, value.toString());
                    }
                });
            }

            // 设置请求体
            if (body != null && (method == Method.POST || method == Method.PUT)) {
                if (body instanceof String) {
                    request.body(body.toString());
                } else {
                    request.body(JSONUtil.toJsonStr(body));
                    request.header("Content-Type", "application/json;charset=UTF-8");
                }
            }

            // 设置其他请求头
            request.header("User-Agent", "ApiHttpClient/1.0");
            request.header("Accept", "application/json");

            // 设置超时
            request.timeout(timeout);

            // 执行请求
            log.info("发起HTTP请求: {} {}, systemName: {}", method.name(), fullUrl, systemName);

            HttpResponse response = request.execute();

            // 返回响应体
            String responseBody = response.body();
            log.debug("HTTP响应状态码: {}, 响应体长度: {}", response.getStatus(), responseBody.length());

            return responseBody;

        } catch (Exception e) {
            log.error("HTTP请求执行失败: {}", e.getMessage(), e);
            return buildErrorResponse("请求执行失败: " + e.getMessage());
        }
    }

    /**
     * 构建完整的请求URL
     */
    private static String buildUrl(String path) {
        StringBuilder url = new StringBuilder(baseUrl);

        // 添加上下文路径
        if (!"/".equals(contextPath) && StrUtil.isNotBlank(contextPath)) {
            if (!contextPath.startsWith("/")) {
                url.append("/");
            }
            url.append(contextPath);
        }

        // 添加API路径
        if (!path.startsWith("/")) {
            url.append("/");
        }
        url.append(path);

        return url.toString();
    }

    /**
     * 构建错误响应
     */
    private static String buildErrorResponse(String message) {
        Map<String, Object> error = new HashMap<>();
        error.put("code", 500);
        error.put("msg", message);
        error.put("data", null);
        return JSONUtil.toJsonStr(error);
    }

    /**
     * 便捷方法：调用MES接口获取商品库存
     *
     * @param systemName 系统名称
     * @param apiKey     API密钥
     * @param barCode    条形码（可选）
     * @param goodsNo    商品编码（可选）
     * @return 库存数量
     * <p>
     * 使用示例：
     * Map<String, Object> params = new HashMap<>();
     * params.put("barCode", "6923651604349");
     * params.put("goodsNo", "HC0013044");
     * String response = ApiHttpClient.getGoodsTotalNum("crm_system", "CRM2024002B3C4D5E6F7G8H9I0J1K", params);
     * System.out.println(response);
     */
    public static String getGoodsTotalNum(String systemName, String apiKey, String barCode, String goodsNo) {
        Map<String, Object> params = new HashMap<>();
        if (StrUtil.isNotBlank(barCode)) {
            params.put("barCode", barCode);
        }
        if (StrUtil.isNotBlank(goodsNo)) {
            params.put("goodsNo", goodsNo);
        }

        return get("/mes/getTotalNum", systemName, apiKey, params);
    }

    /**
     * 便捷方法：调用MES接口获取商品库存（简单版本）
     */
    public static String getGoodsTotalNum(String systemName, String apiKey) {
        return get("/mes/getTotalNum", systemName, apiKey);
    }

    /**
     * 解析响应为CommonResult格式
     *
     * @param responseJson 响应JSON字符串
     * @return CommonResult对象
     */
    public static CommonResult<?> parseResponse(String responseJson) {
        try {
            return JSONUtil.toBean(responseJson, CommonResult.class);
        } catch (Exception e) {
            log.warn("解析响应失败: {}", e.getMessage());
            return null;
        }
    }

    /**
     * 便捷方法：测试API连接（用于验证认证是否正常工作）
     *
     * @param systemName 系统名称
     * @param apiKey     API密钥
     * @return 测试响应
     * <p>
     * 使用示例：
     * String response = ApiHttpClient.testConnection("crm_system", "CRM2024002B3C4D5E6F7G8H9I0J1K");
     * System.out.println(response);
     */
    public static String testConnection(String systemName, String apiKey) {
        return get("/v1/api/mes/getTotalNum", systemName, apiKey);
    }

    /**
     * 简化的CommonResult类（用于其他项目）
     */
    public static class CommonResult<T> {
        private Integer code;
        private String msg;
        private T data;

        public Integer getCode() {
            return code;
        }

        public void setCode(Integer code) {
            this.code = code;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }

        public boolean isSuccess() {
            return code != null && code == 200;
        }

        @Override
        public String toString() {
            return "CommonResult{" +
                    "code=" + code +
                    ", msg='" + msg + '\'' +
                    ", data=" + data +
                    '}';
        }
    }
}